/**
 * @class luffy.common.PopupLayer
 * 마크업을 이용한 팝업 레이어를 제공한다.
 */
luffy.common.PopupLayer = jindo.$Class({
	
	$init : function(sClassName){		
		this.welWrapLayer = jindo.$Element(jindo.$("<div style='display:block;visible:hidden;z-index:30001'>"));
		this.setClassName(sClassName);
		document.body.appendChild(this.welWrapLayer.$value());
	},
	
	/**
	 * htmlElement또는 htmlString을 해당 point에 팝업으로 렌더링 한다.
	 */
	openPopup : function(objOrString, point) {
		this.welWrapLayer.html(objOrString);
		this._showLayer(point);
	},
	/**
	 * htmlElement또는 htmlString을 해당 point에 팝업으로 렌더링 한다.
	 */
	openPopupInTime : function(objOrString, point, nMiliSeconds) {		
		this.welWrapLayer.html(objOrString);
		if(this._oTimer){
			this.closePopup();
			clearTimeout(this._oTimer);
		}
		this._showLayer(point);
		
		var self=this;
		this._oTimer = setTimeout(function(){
			self.closePopup();
		},nMiliSeconds);
	},
	/**
	 * 팝업 엘리먼트를 감춘다.
	 * 크기 계산시에 hidden상태여야 가능하기 때문에 hidden으로 처리한다.
	 */
	closePopup : function(){
		this.welWrapLayer.css("visibility","hidden");
	},
	setClassName : function(sClassName){
		this.welWrapLayer.$value().className = sClassName || 'popupLayer'; 
	},
	getElement :function(){
		return this.welWrapLayer.$value();
	},
	/**
	 * 팝업 엘리먼트를 point를 기준으로 노출 가능한 범위에 노출한다.
	 */
	_showLayer : function(point){
		var oPoint = this._getValidPoint(point);
		this.welWrapLayer.css({
			"left" : oPoint.x + "px",
			"top" : oPoint.y + "px"
		})
		this.welWrapLayer.css("visibility","visible");
	},
	/**
	 * point를 기준으로 팝업 사이즈를 계산하여, 잘리지 않는 위치로 재조정한 포인트를 반환한다.
	 */
	_getValidPoint : function(point){
		var oDocSize = jindo.$Document().clientSize();
		var endXOffset = point.x + this.welWrapLayer.width();
		var moveGap = endXOffset - oDocSize.width;
		
		if(moveGap > 0){
			point.x = point.x - moveGap;
		}
		
		return point;
	}	
});
